from pcaspy import Driver, SimpleServer
from os import environ
from src import ioc_port,Device_pvname_data,balancer,ioc_ip
from src import WR_config,Device_config

TOTAL_POINTS = 2000



pvdb1 = {
    WR_config["频率设定"]: {
        'type': 'float',
        'value': 1,
        'desc': "Frequency set",
        'unit': "Hz"
    },
    WR_config["频率设定状态"]: {
        'type': 'enum',
        'enums': ['Runing', 'Complate'],
        'value': 0
    },
    WR_config["触发设定"]: {
        'type': 'enum',
        'enums': ['Close', 'Continue', 'Single'],
        'value': 0
    },
    WR_config["触发状态"]: {
        'type': 'enum',
        'enums': ['Close', 'Continue', 'Single'],
        'value': 0
    },
    WR_config["超时状态"]: {
        'type': 'enum',
        'enums': ["Interlock","Normal"],
        'value':0
    },
    WR_config["Master同步状态"]: {
        'type': 'enum',
        'enums': ["NOK","OK"],
        'value':0
    },
    WR_config["复位"]: {
        'type': 'enum',
        'enums': ["DisReset","Reset"],
    },
    WR_config["联锁状态"]: {
        'type': 'enum',
        'enums': ["Interlock","Normal"],
        'value':0
    },
    WR_config["凤凰状态"]: {
        'type': 'enum',
        'enums': ["Interlock","Normal"],
        'value':0
    },
    WR_config["心跳状态"]: {
        'type': 'enum',
        'enums': ["Interlock","Normal"],
        'value':1
    },
    WR_config["时间戳ns"]: {
                'type': 'int',
    },
    WR_config["时间戳s"]: {
                'type': 'int',
    },
    WR_config["时间戳UTC"]: {
                'type': 'string',
                }
}
    
    # 各节点PV
pvdb2 = {}
for key in Device_pvname_data:
    # 脉宽
    pvdb2[Device_config["初始化"].format(key)] = {
        'type': 'enum',
        'enums': ["","Init"],
        'value':0
    }
    # 脉宽
    pvdb2[Device_config["触发状态"].format(key)] = {
        'type': 'enum',
        'enums': ['Close', 'Continue', 'Single'],
        'value':0
    }
    # 脉宽
    pvdb2[Device_config["脉宽"].format(key)] = {
        'type': 'int',
        'value': 0,
        'asyn': True,
        'unit': "us"
    }
    # 延时
    pvdb2[Device_config["延时"].format(key)] = {
        'type': 'int',
        'value': 0,
        'asyn': True,
        'unit': "us"
    }
    # 使能
    pvdb2[Device_config["使能状态"].format(key)] = {
        'type': 'enum',
        'enums': ['disable', 'enable'],
        'asyn': True
    }
    # 同步状态W
    pvdb2[Device_config["同步状态"].format(key)] = {
        'type': 'enum',
        'enums': ['NoK', 'OK'],
        'value': 0,
        'asyn': True
    }
    # 温度
    pvdb2[Device_config["温度"].format(key)] = {
        'type': 'float',
        'value': 0.0,
        'prec': 4,
        'asyn': True,
        'unit': "Celsius"
    }
    pvdb2[Device_config["心跳状态"].format(key)] = {
    'type': 'enum',
    'enums': ["Abnormal","Normal"],
    'asyn': True,
    'scan' : 2
    }
    pvdb2[Device_config["心跳状态_Ready"].format(key)] = {
    'type': 'enum',
    'enums': ["NOK","OK"],
    'asyn': True
    }
    pvdb2[Device_config["联锁状态"].format(key)] = {
        'type': 'enum',
        'enums': ["InterLock","Normal"],
        'asyn': True
    }
    pvdb2[Device_config["联锁锁存状态"].format(key)] = {
        'type': 'enum',
        'enums': ["InterLock","Normal"],
        'asyn': True
    }
    pvdb2[Device_config["联锁Bypass"].format(key)] = {
        'type': 'enum',
        'enums': ["0","bypass"],
        'asyn': True
    }
    pvdb2[Device_config["联锁时间戳"].format(key)] = {
        'type': 'string',
        'asyn': True
        }
    
class myDriver(Driver):
    # 初始化函数
    def __init__(self):
        super().__init__()
        balancer.send_message({"from":"IOC—init","Driver":self})
        # for pvname in self.pvDB.keys(): print(pvname)

    def write(self, reason, value):
        try:
            balancer.send_message({"from":"IOC","pvname":reason,"opr":"write","value":value})
        except Exception as e:
            print("IOC to Opr 消息队列发送失败")
        return super().write(reason, value)
    
    def __del__(self):
        # 类停止函数
        # 用来安全关闭进程
        pass


def main():
    try:
        environ["EPICS_CAS_SERVER_PORT"] = ioc_port
        environ["EPICS_CAS_INTF_ADDR_LIST"] = ioc_ip
        environ["EPICS_CA_ADDR_LIST"] = ioc_ip
        prefix = ''
        server = SimpleServer()
        server.createPV(prefix, pvdb1)
        server.createPV(prefix, pvdb2)
        server.setDebugLevel(level=0)
        driver = myDriver()
        print("IOC 进程已启动")
        while True:
            try:
                server.process(0.1)
            except KeyboardInterrupt:
                print("IOC 进程被用户中断")
                break
    except Exception as e:
        print(f"初始化过程中发生错误: {e}")
        
 
